/**
 * 日期列表控件
 * @author Ly
 * @version 1.0a
 */
/**
 * Ly.DateList的构造函数
 * @param {Object} container 日期列表控件的容器对象,默认为body对象
 * @param {Object} config 日期列表控件的配置参数
 * config = {
     acceptor : obj,                            // 接受器，用于接受设置的日期
     date : '',                                 // 当前日期，默认为当前日期
     type : 'yyyy-mm-dd hh-ii-ss',
     step : [1, 1, 1, 1, 10, 10]                // 步长，格式［年，月，日，时，分，秒］
 }
 */
Ly.DateList = function(container, config) {
    var _this = this;
    config = config || {};
    this.config = {
        container : container || document.body,
        acceptor : config.acceptor,
        date : config.date ? eval('new Date(' + config.date + ')') : new Date(),
        type : config.type || 'yyyymmdd',       // 默认为年月日
        step : config.step || [1, 1, 1],        // 默认步长为1
        obj : {
            container : null,
            year : null,
            month : null,
            date : null,
            hour : null,
            minute : null,
            second : null
        }
    };
    this.private = {
        /**
		 * 獲取當前月的天數
		 * @param {Number} m 要判斷天數的月份
		 */
		date : function(m /* Number */) {
            if (m == 2) {
                if (Ly.isLeapYear(_this.config.obj.year.value)) {
                    return 29;
                } else {
                    return 28;
                }
            } else {
                switch (parseInt(m)) {
                    case 1:
                    case 3:
                    case 5:
                    case 7:
                    case 8:
                    case 10:
                    case 12:
                        return 31;
                        break;
                    default :
                        return 30;
                }
            }
		},
		// 初始化日期列表控件
        init : function() {
            var
                c = _this.config,
                co = c.obj;
            // 创建自身容器对象
            co.container = Ly.createElement('span', { style : 'display: none;' });
            
            for (var i = 0; i < c.step.length; i++) {
                co.container.appendChild(this.createElement(i, c.step[i]));
            }
            c.container.appendChild(co.container);
        },
        /**
         * 创建日期列表控件的元素
         * @param {Number} index 创建的序列，从零开始，0代表为年，1代表为月，依次类推
         * @param {Number} step 步长
         */
        createElement : function(index, step) {
            var
                c = _this.config,
                obj = Ly.createElement('select'),
                s = Ly.createElement('span'),
                n,
                start,
                end,
                tag;
            
            switch (index) {
                case 0:    // 年
                    // 对于年默认显示１０项
                    n = c.date.getFullYear();
                    start = n - 5;
                    end = n + 5;
                    
                    this.initElement(obj, start, end, step, n);
                    Ly.addEvent('onchange', this.changeYear, obj);
                    c.obj.year = obj;
                    tag = '年';
                    break;
                case 1:    // 月
					this.initElement(obj, 1, 12, step, c.date.getMonth() + 1);
                    Ly.addEvent('onchange', this.changeMonth, obj);
                    c.obj.month = obj;
                    tag = '月';
                    break;
                case 2:    // 日
					n = c.date.getDate();
                    start = 1;
                    end = this.date(c.date.getMonth() + 1);
                    
                    this.initElement(obj, start, end, step, n);
                    c.obj.date = obj;
                    tag = '日';
                    break;
                case 3:    // 时
                    this.initElement(obj, 0, 23, step, c.date.getHours());
                    c.obj.hour = obj;
                    tag = '时';
                    break;
                case 4:    // 分
                    this.initElement(obj, 0, 59, step, c.date.getMinutes());
                    c.obj.minute = obj;
                    tag = '分';
                    break;
                case 5:    // 秒
                    this.initElement(obj, 0, 59, step, c.date.getSeconds());
                    c.obj.second = obj;
                    tag = '秒';
                    break;
            }
            s.appendChild(obj);
            s.appendChild(document.createTextNode(tag));
            Ly.addEvent('onchange', this.returnDate, obj);
            return s;
        },
        /**
         * 初始化元素值
         * @param {Object} obj 要初始化的元素
         * @param {Number} start 起始值
         * @param {Number} end 结束值
         * @param {Number} step 步长
         * @param {Number} 默认值
         */
        initElement : function(obj, start, end, step, cd) {
            cd = cd > end ? end : cd;
            for (var i = start; i <= end;) {
                obj.options[obj.length] = new Option(i, i);
                if (cd - i < step && cd - i > -1) {
                    obj.options[obj.length - 1].selected = true;
                }
                i += step;
            }
            return obj;
        },
        /**
         * 年份控件的改变事件
         * @param {Object} obj 当前控件
         */
        changeYear : function(obj) {
            if (_this.config.obj.month.value == 2) {
                if (Ly.isLeapYear(obj.value)) {
                    _this.private.updateDate(29);
                } else {
                    _this.private.updateDate(28);
                }
            }
            _this.private.returnDate();
        },
        /**
         * 月份控件的改变事件
         * @param {Object} obj 当前控件
         */
        changeMonth : function(obj) {
            _this.private.updateDate(_this.private.date(obj.value));
            _this.private.returnDate();
        },
        /**
         * 更新日控件
         * @param {Number} end 结束日期
         */
        updateDate : function(end) {
            var
                c = _this.config,
                d = c.obj.date,
                dd;
            if (d == null) { return; }
            
            dd = d.value;
            
            // 清空数据
            for (var i = d.length - 1; i >= 0; i--) {
                d.remove(i);
            }
            
            this.initElement(d, 1, end, c.step[2], dd);
        },
        returnDate : function() {
            var
                c = _this.config,
                p = _this.private,
                t = c.type,
                o = c.obj,
                y = t.findCount('y'),
                m = t.findCount('m'),
                d = t.findCount('d'),
                h = t.findCount('h'),
                i = t.findCount('i'),
                s = t.findCount('s');
            
            if (y > 0) {
                t = t.replace(Ly.copy('y', y), o.year.value.slice(-y));
            }
            if (m > 0) {
                t = t.replace(Ly.copy('m', m), ('00' + o.month.value).slice(-m));
            }
            if (d > 0) {
                t = t.replace(Ly.copy('d', d), ('00' + o.date.value).slice(-d));
            }
            if (h > 0) {
                t = t.replace(Ly.copy('h', h), ('00' + o.hour.value).slice(-h));
            }
            if (i > 0) {
                t = t.replace(Ly.copy('i', i), ('00' + o.minute.value).slice(-i));
            }
            if (s > 0) {
                t = t.replace(Ly.copy('s', s), ('00' + o.second.value).slice(-s));
            }
            c.acceptor.value = t;
        }
    };
};
Ly.DateList.prototype = {
    ver : '1.0a',
    /**
     * 渲染控件
     */
    render : function() {
        this.private.init();
        this.config.obj.container.style.display = 'inline';
        this.private.returnDate();
    }
};